﻿/*
file js quản lý sổ văn bản
*/
$(document).ready(function () {
    if (typeof (VOFFICE) == "undefined") {
        // ReSharper disable AssignToImplicitGlobalInFunctionScope
        VOFFICE = {};
        // ReSharper restore AssignToImplicitGlobalInFunctionScope
    }

    VOFFICE.ManageBook = (function () {
        var methods = {};

        methods.PageSize = 50;
        methods.BookGrid = null;
        methods.BookForm = null;
        methods.BookTypeList = null;
        methods.ResetByList = null;
        methods.Collection = null;
        methods.CustomValidate = {
            errorLabelContainer: "#book-form-error",
            rules: {
                Name: { required: true },
                OfficeIdUse: { required: true }
            },
            messages: {
                Name: { required: jsResources.lang.ManageBookNameRequired },
                OfficeIdUse: { required: jsResources.lang.ManageBookOfficeUseRequired }
            }
        };

        var $table = $('#list-details');
        var $pager = $('#pager');
        var $dialog = $('#book-dialog').dialog({
            autoOpen: false,
            show: "fade",
            hide: "fade",
            modal: true,
            height: 'auto',
            width: 600,
            open: function (event, ui) {
                //$('.ui-dialog-titlebar', ui.dialog || ui).hide();
            },
            close: function (event, ui) {
            }
        });

        var $buttonSearch = $('#btn-search');
        var $btnCancelSearch = $('#btn-cancel-search');
        var $key = $('#ipt-search');
        methods.busy = false;

        /*
        Thực hiện tìm kiếm 
        Với số lượng bản ghi không lớn, sẽ không phân trang kết quả tìm kiếm
        $pager.fadeOut("fast");
        */
        var search = function (event) {
            if (!!$key.val()) {
                if (!methods.busy) {
                    methods.busy = true;
                    $pager.fadeOut("fast");
                    SaveIndicator.indicate($.get('/book/search_book', { key: $key.val(), nocache: (new Date()).toJSON() }, function (data) {
                        methods.busy = false;
                        $btnCancelSearch.show();
                        if (!!data && data.Status == true) {
                            VH.DateUtility.FixDates(data);
                            var list = new BookCollection();
                            if (data.Result && data.Result.length > 0) {
                                _.each(data.Result, function (item) {
                                    var book = new Book({
                                        'id': item.Id,
                                        'Name': item.Name,
                                        'OfficeNameUse': item.OfficeNameUse,
                                        'BookTypeName': item.BookTypeName,
                                        'Description': item.Description,
                                        'BookType': item.BookType,
                                        'CurrentNumber': item.CurrentNumber,
                                        'Sequence': item.Sequence,
                                        'IsActive': item.IsActive,
                                        'IsDefault': item.IsDefault,
                                        'Format': item.Format,
                                        'ResetBy': item.ResetBy,
                                        'ResetName': item.ResetName,
                                        'OfficeIdUse': item.OfficeIdUse,
                                        'CreatedAt': item.CreatedAt,
                                        'UpdatedAt': item.UpdatedAt,
                                        'CreatorId': item.CreatorId
                                    });
                                    list.push(book);
                                });
                                $table.find('tbody').remove();
                                methods.Collection = list;
                                methods.BookGrid = new BookGrid({ collection: list });
                                $table.append(methods.BookGrid.render().el);
                            } else {
                                alert(jsResources.lang.ManageBookNoItem);
                            }
                        }
                    }));
                }
            } else {
                $key.focus();
            }
        };

        /*
        Thực hiện việc bỏ search
        */
        var cancelSearch = function (event) {
            methods.busy = false;
            $btnCancelSearch.hide();
            //$buttonSearch.fadeIn();
            $key.val('');
            //gọi lại list từ trang 1
            getPagedBook(1);
        };
        /*
        Lấy hết sổ văn bản theo phân trang
        */
        var getPagedBook = function (pageIndex) {
            pageIndex = parseFloat(pageIndex) - 1;
            //lấy dữ liệu
            SaveIndicator.indicate($.get('/book/get_all_books', { 'pageIndex': pageIndex, 'pageSize': methods.PageSize, nocache: (new Date()).toJSON() }, function (data) {
                if (!!data && data.Status == true) {
                    if (!!data.Result.List) {
                        VH.DateUtility.FixDates(data);
                        $table.find('tbody').remove();
                        var list = new BookCollection();
                        if (data.Result.List.length > 0) {
                            _.each(data.Result.List, function (item) {
                                var book = new Book({
                                    'id': item.Id,
                                    'Name': item.Name,
                                    'OfficeNameUse': item.OfficeNameUse,
                                    'BookTypeName': item.BookTypeName,
                                    'Description': item.Description,
                                    'BookType': item.BookType,
                                    'CurrentNumber': item.CurrentNumber,
                                    'Sequence': item.Sequence,
                                    'IsActive': item.IsActive,
                                    'IsDefault': item.IsDefault,
                                    'Format': item.Format,
                                    'ResetBy': item.ResetBy,
                                    'ResetName': item.ResetName,
                                    'OfficeIdUse': item.OfficeIdUse,
                                    'CreatedAt': item.CreatedAt,
                                    'UpdatedAt': item.UpdatedAt,
                                    'CreatorId': item.CreatorId
                                });
                                list.push(book);
                            });
                            $table.fadeIn();
                        }
                        methods.Collection = list;
                        methods.BookGrid = new BookGrid({ collection: list });
                        $table.append(methods.BookGrid.render().el);

                        //phân trang
                        paging(1 + data.Result.PageIndex, data.Result.PageCount);
                    } else {

                    }
                }
            }));
        };
        /*
        Hiển thị dialog để thêm sổ mới
        */
        var addNew = function () {
            //get all data for dropdownlist
            methods.BookForm = new BookForm({ model: new Book() });
            $dialog.html(methods.BookForm.render().el);
            $('#book-form').validate(methods.CustomValidate);
            $dialog.dialog('open');
            $('#book-form input[type=submit]').button();
        };
        /*
        Hiển thị form để sửa một sổ đã tạo
        */
        methods.edit = function (model) {
            methods.BookForm = new BookForm({ model: model });
            $dialog.html(methods.BookForm.render().el);
            $('#book-form').validate(methods.CustomValidate);
            console.log(this.BookTypeList);
            $dialog.dialog('open');
            $('#book-form input[type=submit]').button();
        };
        /*
        Copy một sổ để tạo ra một sổ mới từ thông tin đã có
        */
        methods.copy = function (model) {
            methods.BookForm = new BookForm({ model: model });
            $dialog.html(methods.BookForm.render().el);
            $('#book-form').validate(methods.CustomValidate);
            $dialog.dialog('open');
            $('#book-form input[type=submit]').button();
        };

        /*
        Hàm cập nhập dữ liệu trên trang sau khi save
        */
        methods.updateGrid = function (model, isNew) {
            $table.fadeIn("fast");
            if (isNew) {
                methods.Collection.add(model, { at: 0 });
            }
            $dialog.dialog('close');
        };

        /*
        Đóng dialog
        */
        methods.closeDialog = function () {
            $dialog.dialog('close');
        };

        /*
        gọi lại hàm validate form sau khi nó bị backbone render lại
        */
        methods.recallValidate = function () {
            $('#book-form').validate(methods.CustomValidate);
            $('#book-form input[type=submit]').button();
        };

        /* lay cac gia tri key - value de dua vao form tao va sua
        load lén lút
        */
        var getKeyValue = function () {
            if (!methods.BookTypeList) {
                $.get('/keyvalue/get_book_type', { nocache: (new Date()).toJSON() }, function (data) {
                    if (!!data && data.Status == true) {
                        methods.BookTypeList = data.Result;
                    }
                });
            }
            if (!methods.ResetByList) {
                $.get('/keyvalue/get_book_reset_by', { nocache: (new Date()).toJSON() }, function (data) {
                    if (!!data && data.Status == true) {
                        methods.ResetByList = data.Result;
                    }
                });
            }
        };

        /*
        Tạo phân trang
        */
        var paging = function (currentPage, pageCount) {
            if (pageCount > 1) {
                $pager.pager({ pagenumber: currentPage, pagecount: pageCount, buttonClickCallback: getPagedBook });
                $pager.fadeIn();
            }
        };

        // quy ước về hàm khởi tạo
        methods.init = function () {
            var $addNew = $('#add-new');
            $addNew.button().addClass('ui-button-primary');
            $addNew.live('click', addNew);

            $buttonSearch.button();
            $buttonSearch.live('click', search);
            $btnCancelSearch.button().css('display','none');
            $btnCancelSearch.live('click', cancelSearch);
            getPagedBook(1);
            getKeyValue();
        };
        return methods;
    })(VOFFICE.ManageBook);

    //gọi hàm khởi tạo
    VOFFICE.ManageBook.init();
});

/*
View để thêm mới hay chỉnh sửa book (sổ công văn)
*/
window.BookForm = Backbone.View.extend({
    events: {
        'click .btn-change-dept': 'chooseDept',
        'change #Format': 'changeFormat',
        'keyup #Format': 'changeFormat',
        'click .suggest' : 'useSuggestFormat',
    },
    
    useSuggestFormat :function(event) {
        ///<summary>
        /// Khi người dùng click vào bất cứ gợi ý mã vào sổ nào
        ///</summary>    
        var $format = $('#Format');
        $format.val($format.val() + $(event.currentTarget).text());
        $format.trigger('change');
    },

    changeFormat: function (event) {
        ///<summary>
        /// Thay đổi format
        ///</summary>
        var $target = $(event.currentTarget);
        if ($target && $target.length > 0) {
            if (jQuery.trim($target.val()).length > 0) {
                $('.show-reset').fadeIn();
            } else {
                $('.show-reset').fadeOut();
            }
        }
    },
    /*
    Chọn phòng ban
    */
    chooseDept: function (event) {
        /// <summary>
        /// Bật dialog hiển thị để chọn phòng ban
        /// </summary>
        var self = this;
        self.model.set({
            'Name': $('#Name').val(),
            'Description': $('#Description').val(),
            'BookType': $('#BookType').val(),
            'CurrentNumber': $('#CurrentNumber').val(),
            'Format': $('#Format').val(),
            'ResetBy': $('#ResetBy').val(),
            'IsActive': $('#IsActive').is(':checked'),
            'IsDefault': $('#IsDefault').is(':checked')
        });

        $('#book-form input[type=submit]').button();
        /*
        Hiển thị cây phòng ban
        */
        VH.ShowDeptTree(function () {
            if (!!window.SelectedDeptId) {
                self.model.set({ 'OfficeIdUse': window.SelectedDeptId, 'OfficeNameUse': window.SelectedDeptName });
                VOFFICE.ManageBook.recallValidate();
            }
        });
    },

    initialize: function () {
        //đưa sự kiện vào đây nếu đưa ở events thì ko validate được dữ  liệu
        //đang tìm nguyên nhân
        $('#book-form').die('submit');
        $('#book-form').live('submit', this.submitBook);
        //bind để tự động cập nhập lại dữ liệu khi các field của model thay đổi
        this.model.bind("change", this.render, this);
        this.model.bind("destroy", this.close, this);
    },

    /* 
    Cập nhập hoặc thêm mới sổ văn bản 
    */
    submitBook: function (event) {
        /// <summary>
        /// Cập nhập hoặc thêm mới một sổ văn bản
        /// </summary>
        event.preventDefault();
        //bug fixes
        var self = VOFFICE.ManageBook.BookForm;
        if (!self) {
            VOFFICE.ManageBook.closeDialog();
        }
        var isNew = self.model.isNew();
        //tao moi hay cap nhap du lieu
        SaveIndicator.indicate(self.model.save({
            'Name': $('#Name').val(),
            'Description': $('#Description').val(),
            'BookType': $('#BookType').val(),
            'CurrentNumber': $('#CurrentNumber').val(),
            'Format': $('#Format').val(),
            'ResetBy': $('#ResetBy').val(),
            'IsActive': $('#IsActive').is(':checked'),
            'IsDefault': $('#IsDefault').is(':checked'),
            'ResetName': $("#ResetBy option:selected").text(),
            'BookTypeName': $("#BookType option:selected").text()
        }, {
            success: function (data) {
                if(data.get('Status') == true){
                    VOFFICE.ManageBook.updateGrid(self.model, isNew);
                }
            },
            error: function (data) {
                VOFFICE.ManageBook.closeDialog();
            },
            complete: function () {
                self.close();
                return false;
            }
        }));
    },

    render: function () {
        this.template = _.template($('#book-form-template').html());
        $(this.el).html(this.template({ model: this.model.toJSON() }));
        return this;
    },

    close: function () {
        this.unbind();
        this.model.unbind("change", this.render, this);
        $('#book-form').die('submit', this.submitBook);
        this.remove();
    }
});
/*
Chứa một collection là list các book model
gọi đến BookGridItem để hiển thị dữ liệu
*/
window.BookGrid = Backbone.View.extend({
    tagName: 'tbody',
    render: function () {
        $(this.el).html('');
        var i = 1;
        _.each(this.collection.models, function (book) {
            book.set({ 'Order': i });
            $(this.el).append((new BookGridItem({ model: book })).render().el);
            i++;
        }, this);
        return this;
    },

    /* 
    Khi grid có thêm bản ghi thì cập nhập
    */
    initialize: function () {
        var self = this;
        this.collection.bind("reset", this.render, this);
        this.collection.bind("add", function (book) {
            $(self.el).prepend(new BookGridItem({ model: book }).render().el);
        });
    }
});

/*
từng item trong grid dữ liệu
các item này tạo thành table chứa thông tin tất cả các book có trong hệ thống
*/
window.BookGridItem = Backbone.View.extend({
    tagName: 'tr',

    //bind để tự động cập nhập lại dữ liệu khi các field của model thay đổi
    initialize: function () {
        this.model.bind("change", this.render, this);
        this.model.bind("destroy", this.close, this);
    },
    /*
    Các sự kiện trên một dòng trong grid 
    */
    events: {
        'click .grid-update-book': 'showUpdate',
        'click .grid-delete-book': 'deleteBook',
        'click .grid-copy-book': 'copyBook',
        'change .cbxIsActive': 'activeBook',
        'change .cbxIsDefault': 'defaultBook'
    },

    /*
    Chọn xem có là sổ văn bản mặc định hay không
    */
    defaultBook: function (event) {
        var $target = $(event.currentTarget);
        var self = this;
        //luu du lieu
        SaveIndicator.indicate(self.model.save({ 'IsDefault': $target.is(':checked'), 'modified': 'IsDefault' }, function (data) {
            if (!data || data.Status == false) {
                alert("");
            }
        }));
    },

    /*
    Active hay InActive sổ văn bản
    */
    activeBook: function (event) {
        var $target = $(event.currentTarget);
        var self = this;
        //luu du lieu
        SaveIndicator.indicate(self.model.save({ 'IsActive': $target.is(':checked'), 'modified': 'IsActive' }, function (data) {
            if (!data || data.Status == false) {
                alert("");
            }
        }));
    },

    /* 
    Copy một sổ văn bản
    */
    copyBook: function (event) {
        var model = this.model;
        var book = new Book({
            'Name': model.get('Name'),
            'Description': model.get('Description'),
            'BookType': model.get('BookType'),
            'Format': model.get('Format'),
            'ResetBy': model.get('ResetBy'),
            'IsActive': model.get('IsActive'),
            'IsDefault': model.get('IsDefault'),
            'OfficeIdUse': model.get('OfficeIdUse'),
            'OfficeNameUse': model.get('OfficeNameUse')
        });
        VOFFICE.ManageBook.copy(book);
    },

    /*
    Xóa sổ văn bản
    */
    deleteBook: function (event) {
        var self = this;
        VH.ConfirmBox(jsResources.ManageBookDeleteConfirm(self.model.get('Name'), self.model.get('OfficeNameUse')), jsResources.lang.Delete, jsResources.lang.Cancel,
            function () {
                //xoa du lieu
                SaveIndicator.indicate($.post('/book/delete_book', { id: self.model.get('id') }, function (data) {
                    if (!!data && data.Status == true) {
                        self.close();
                    } else {
                        VH.MessageBox(jsResources.lang.ManageBookDeleteError, null);
                    }
                }));
            },
            function () {
                return true;
            }
        );
    },

    /*
    Hiển thị màn hình để cập nhập sổ văn bản
    */
    showUpdate: function (event) {
        VOFFICE.ManageBook.edit(this.model);
    },

    /*
    Kết hợp template và model để hiển thị lên 1 dòng (tr)
    chứa thông tin của 1 sổ văn bản trong grid
    */
    render: function () {
        this.template = _.template($('#list-book-item-template').html());
        $(this.el).html(this.template({ model: this.model.toJSON() }));
        return this;
    },

    close: function () {
        $(this.el).remove();
    }
});